import {
  NestInterceptor,
  ExecutionContext,
  BadGatewayException,
} from '@nestjs/common';
import {
  Observable, of,
  tap,
} from 'rxjs';
import { Request } from 'express'

let catchMap = new Map() // 缓存请求的结果
catchMap.set('1', { name: '张三' })

/**
 * 缓存拦截器 根据前端的查询参数id来判断是否需要执行路由处理函数
 */
export class CatchInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next): Observable<any> {
    const request = context.switchToHttp().getRequest<Request>() // 获取请求对象
    const id = request.query.id as string
    const user = catchMap.get(id) // 如果缓存中存在 则直接从缓存中取 不需要执行路由处理函数
    if (user) {
      console.log('没有执行路由处理函数 ')
      return of(user) // 直接从缓存中取
    }
    return next
      .handle()
      .pipe(
        // 执行副作用
        tap({
          next: val => {
            catchMap.set(id, val) // 将结果缓存起来
          }
        }),
      )
  }
}
